以下筆記摘錄自『 The Go Workshop 』。
Go語言只支援一種迴圈迴圈敘述,就是for迴圈。
Go語言的陣列(Array)及切片(Slice)兩種集合型別很適用for i 的迴圈,因為鍵與值會照順序排列,所以可以使用for i來走訪,如以下:
for <起始賦值敘述>; <條件敘述> ; <結束敘述> {
<程式區塊>
}
For example,
package main
import "fmt"
func main() {
names := []string{"Jim", "Jane", "Joe", "June"}
for i := 0; i < len(names); i++ {
fmt.Println(names[i])
}
}
//output
Jim
Jane
Joe
June
但若是映射表(Map)這類的集合型別,鍵與值不會照順序排列,使用for i就不便利,所以必須使用for range迴圈,這相當於一些語言的for each或 for in迴圈,每次從集合取出一組值,走訪後回圈及結束,如下:
for <鍵>, <值> := range <集合> {
<程式區塊>
}
如果再回圈用不到key或value變數,可以在接收時寫成底線字元_
for _, value := range config {
fmt.PrintLn(value)
}
如果只想取出鍵,則可以省略第二個變數不寫,這寫法等同於
for key, _ := range config
for key := range config {
fmt.PrintLn(value)
}
range其實也可以用在陣列或切片,在這種情況下key是元素索引,value是元素值。
names := []string{"Jim", "Jane", "Joe", "June"}
for i, value := range names {
fmt.Println("Index", i, "=", value)
}
這樣做跟for i的效果一樣,而且不需要自習計算集合長度,也就是不需要用到len(),程式變得比較簡潔。並且,使用range走訪陣列或切片會保證按照索引順序輸出。
但若要再迴圈中修改原始集合內的元素,就仍得使用name[i],因為value是個在迴圈內建立的獨立變數,與原集合沒有關係。